package cn.wolfcode.crm.web.interceptor;

import cn.wolfcode.crm.util.UserContext;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 4.	在App类中贴的@SpringBootApplication代表什么
 *
 * @SpringBootApplication Springboot功能注解, Springboot所有核心功能全部靠这个注解去实现
 * 里面包含3个核心功能,即下面3个核心注解
 *      @ComponentScan
 *          组件扫描注解, 扫描指定包及其子包下所有贴有版型标签类, 创建对象交给Spring容器管理
 *          @SpringBootConfiguration
 *              表示Springboot 配置类标签,该标签上有个@Configuration标签,表示当前App类是Spring容器配置类
 *              @EnableAutoConfiguration
 *                  启动Springboot自动扫描配置类的标签, 该标签功能很强大,
 *              可以批量扫描Springboot项目中使用的配置类,并且[按照需求]自动加载到Spring容器里面
 *      该标签上面有个功能标签@Import(AutoConfigurationImportSelector.class),导入一个AutoConfigurationImportSelector类,此类是一个配置类选择器,能批量选择配置类
 * 配置类加载路径:
 *      Spring-boot-autoconfigure-2.2.6.RELEASE.jar!/META-INF/spring.factories
 *      这个文件加载SpringBoot所有自动导入的配置类
 * 这些配置类使用原理:
 *  1.Springboot启动之后.通过
 *          @EnableAutoConfigurationd,
 *          AutoConfigurationImport Selector类
 *          导入功能将所有能自动配置的组件的配置类全部加载到内存中,次数这些配置类并没有真实import到Spring容器,也即没有开始使用
 *  2.SpringBoot会根据导入的jar依赖来解决将那些配置类合并Spring容器中
 *      比如:
 *           导入:Spring-boot-starter-web这个jar包依赖,Springboot会识别Springmvc环境,就会自动import这个配置类:DispatcherServletAutoConfiguration
 *      DispatcherServletAutoConfiguration这个配置类能配置SpringMV
 * 所有环境比如创建并配置DispatcherServlet实例
 *      导入: Spring-boot-starter-freemarker这个jar依赖,Springboot会识别需要配置freemarker相关环境,会自动import  freeMarkerAutoConfiguration这个配置类
 * freeMarkerAutoConfiguration这个配置类配置freemarker需要视图解析器:FreemarkerViewResoLver和FreeMarkerConfigurer
 * 总结:
 *      Springboot其实遵循一个原则, 按需加载, 约定大于配置
 *      SpringBoot会根据你导入的依赖来自动加载对应的功能,并通过默认值的方式进行默认配置,如果需要自定义,可以通过配置文件(application.properties)进行覆盖修改
 */
public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        //instanceof  判断左边对象是不是右边类的实例， 如果是true， 反之为false
        if (!(handler instanceof HandlerMethod)) {
            return true;  //静态资源放行
        }
        //从session中获取登录用户
        Object employee = UserContext.getCurrentUser();
        if (employee == null) { //没有登录
            response.sendRedirect("/login.html");
            return false;//不放行
        }
        return true; //已经登录,可以放行
        /*//获取请求路径
        String uri = request.getRequestURI();
        //如果url路径里面包含：/employee/要求登录
        if(uri.contains("/employee/")){
            response.sendRedirect("/login.html");
            return false;
        }
        //放行
        return true;*/
    }
}
